package com.dmxh.service.impl;

import com.dmxh.api.ItemAPI;
import com.dmxh.pojo.TbItem;
import com.dmxh.service.CartService;
import com.dmxh.vo.CartVo;
import com.dmxh.vo.DetailVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

@Service
public class CartServiceImpl implements CartService {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private ItemAPI itemAPI;

    @Override
    public void addCart(String userid, Long itemId, Integer num) {
        List<CartVo> cartList = (List<CartVo>) redisTemplate.boundHashOps("CartList").get(userid);
        if (cartList == null) {
            cartList = new ArrayList<>();
        }
        /*根据itemid 查询商家名称*/
        TbItem tbItem = itemAPI.queryItemSeller(itemId);
        String seller = tbItem.getSeller();
        CartVo cartVo = null;/*购物车:商家   详情*/
        for (CartVo cartlistVo : cartList) {
            if (Objects.equals(cartlistVo.getSeller(), seller)) {
                cartVo = cartlistVo;/*如果相等 就把当前cartlistvo 对象赋值给 carvo 然后结束这个循环*/
                break;/*如果当前redis购物车中 有值 那就循环遍历 找到相等的商家 把当前的cartlistvo 对象赋值给 carvo 然后结束这个循环
                那当前的商家购物车就有值了 再去判断商品是否是同一个类型 如果是同一个类型 那就说明商品详情不为空  就去增加数量和金额*/
            }
        }
        if (cartVo == null) {/*大购物车为空 那就创建一个新的购物车*/
            /*没有这个商家  就新建一个商家购物车*/
            CartVo newcartVo = new CartVo();
            newcartVo.setSeller(seller);/*商家*/

            List<DetailVo> detailVos = new ArrayList<>();
            DetailVo detailVo = new DetailVo();

            detailVo.setNum(num);
            detailVo.setPrice(tbItem.getPrice());
            detailVo.setTitle(tbItem.getTitle());
            detailVo.setSellerId(seller);
            detailVo.setGoodsId(tbItem.getGoodsId());
            detailVo.setTotalFee(tbItem.getPrice().multiply(new BigDecimal(num)));/*做乘法*/
            detailVo.setPicPath(tbItem.getImage());
            detailVo.setItemId(itemId);
            /*存*/
            detailVos.add(detailVo);
            newcartVo.setDetails(detailVos);
            cartList.add(newcartVo);
        } else {
            //4.商家存在，判断该商品是否已经添加过。
            List<DetailVo> details = cartVo.getDetails();
            DetailVo detailVo = null;
            for (DetailVo detail : details) {
                if (Objects.equals(detail.getItemId(), itemId)) {
                    /*一致 添加过商品*/
                    detailVo = detail;
                    break;
                }
            }
            //5.如果该商品没有添加过，创建该商品信心，存
            if (detailVo == null) {
                detailVo = new DetailVo();
                detailVo.setNum(num);
                detailVo.setPrice(tbItem.getPrice());
                detailVo.setTitle(tbItem.getTitle());
                detailVo.setSellerId(seller);
                detailVo.setGoodsId(tbItem.getGoodsId());
                detailVo.setTotalFee(tbItem.getPrice().multiply(new BigDecimal(num)));/*做乘法*/
                detailVo.setPicPath(tbItem.getImage());
                detailVo.setItemId(itemId);
                /*存*/
                details.add(detailVo);
            } else {
                //6.如果该商品存在，更新商品数量，和总价。
                detailVo.setNum(detailVo.getNum() + num);
                detailVo.setTotalFee(detailVo.getPrice().multiply(new BigDecimal(detailVo.getNum())));

                //num数量为0的时候 从明细列表中删除
                if (detailVo.getNum() <= 0) {
                    details.remove(detailVo);
                }
                //当明细列表数量等于0 直接从购物车删除列表
                if (details.size() == 0) {
                    cartList.remove(cartVo);//删除整个购物车
                }
            }
        }
        //7.最后，把购物车列表存入redis中
        redisTemplate.boundHashOps("CartList").put(userid, cartList);
    }


    @Override
    public Object getCart(String userid) {
        List<CartVo> cartList = (List<CartVo>) redisTemplate.boundHashOps("CartList").get(userid);
        return cartList;
    }
}
